{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "jYysdyb-CaWM"
   },
   "source": [
    "# Demo：对服装图像进行识别"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "FbVhjPpzn6BM"
   },
   "source": [
    "这个Demo将利用Tensorflow训练一个神经网络模型，对运动鞋和衬衫等服装图像进行分类。下面的步骤需要在Tensorflow等库被安装之后才能执行。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "dzLKpmZICaWN",
    "outputId": "1ef4807f-27d9-4282-ab93-0d0322464f86"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "A module that was compiled using NumPy 1.x cannot be run in\n",
      "NumPy 2.1.1 as it may crash. To support both 1.x and 2.x\n",
      "versions of NumPy, modules must be compiled with NumPy 2.0.\n",
      "Some module may need to rebuild instead e.g. with 'pybind11>=2.12'.\n",
      "\n",
      "If you are a user of the module, the easiest solution will be to\n",
      "downgrade to 'numpy<2' or try to upgrade the affected module.\n",
      "We expect that some modules will need time to support NumPy 2.\n",
      "\n",
      "Traceback (most recent call last):  File \"<frozen runpy>\", line 198, in _run_module_as_main\n",
      "  File \"<frozen runpy>\", line 88, in _run_code\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\ipykernel_launcher.py\", line 18, in <module>\n",
      "    app.launch_new_instance()\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\traitlets\\config\\application.py\", line 1075, in launch_instance\n",
      "    app.start()\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\ipykernel\\kernelapp.py\", line 739, in start\n",
      "    self.io_loop.start()\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tornado\\platform\\asyncio.py\", line 205, in start\n",
      "    self.asyncio_loop.run_forever()\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\asyncio\\base_events.py\", line 607, in run_forever\n",
      "    self._run_once()\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\asyncio\\base_events.py\", line 1919, in _run_once\n",
      "    handle._run()\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\asyncio\\events.py\", line 80, in _run\n",
      "    self._context.run(self._callback, *self._args)\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 545, in dispatch_queue\n",
      "    await self.process_one()\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 534, in process_one\n",
      "    await dispatch(*args)\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 437, in dispatch_shell\n",
      "    await result\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\ipykernel\\ipkernel.py\", line 362, in execute_request\n",
      "    await super().execute_request(stream, ident, parent)\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 778, in execute_request\n",
      "    reply_content = await reply_content\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\ipykernel\\ipkernel.py\", line 449, in do_execute\n",
      "    res = shell.run_cell(\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\ipykernel\\zmqshell.py\", line 549, in run_cell\n",
      "    return super().run_cell(*args, **kwargs)\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3075, in run_cell\n",
      "    result = self._run_cell(\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3130, in _run_cell\n",
      "    result = runner(coro)\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\IPython\\core\\async_helpers.py\", line 128, in _pseudo_sync_runner\n",
      "    coro.send(None)\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3334, in run_cell_async\n",
      "    has_raised = await self.run_ast_nodes(code_ast.body, cell_name,\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3517, in run_ast_nodes\n",
      "    if await self.run_code(code, result, async_=asy):\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3577, in run_code\n",
      "    exec(code_obj, self.user_global_ns, self.user_ns)\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_19876\\3302472256.py\", line 2, in <module>\n",
      "    import tensorflow as tf\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\__init__.py\", line 47, in <module>\n",
      "    from tensorflow._api.v2 import __internal__\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\_api\\v2\\__internal__\\__init__.py\", line 11, in <module>\n",
      "    from tensorflow._api.v2.__internal__ import distribute\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\_api\\v2\\__internal__\\distribute\\__init__.py\", line 8, in <module>\n",
      "    from tensorflow._api.v2.__internal__.distribute import combinations\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\_api\\v2\\__internal__\\distribute\\combinations\\__init__.py\", line 8, in <module>\n",
      "    from tensorflow.python.distribute.combinations import env # line: 456\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\python\\distribute\\combinations.py\", line 33, in <module>\n",
      "    from tensorflow.python.distribute import collective_all_reduce_strategy\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\python\\distribute\\collective_all_reduce_strategy.py\", line 25, in <module>\n",
      "    from tensorflow.python.distribute import cross_device_ops as cross_device_ops_lib\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\python\\distribute\\cross_device_ops.py\", line 28, in <module>\n",
      "    from tensorflow.python.distribute import cross_device_utils\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\python\\distribute\\cross_device_utils.py\", line 22, in <module>\n",
      "    from tensorflow.python.distribute import values as value_lib\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\python\\distribute\\values.py\", line 23, in <module>\n",
      "    from tensorflow.python.distribute import distribute_lib\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\python\\distribute\\distribute_lib.py\", line 205, in <module>\n",
      "    from tensorflow.python.data.ops import dataset_ops\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\python\\data\\ops\\dataset_ops.py\", line 34, in <module>\n",
      "    from tensorflow.python.data.ops import iterator_ops\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\python\\data\\ops\\iterator_ops.py\", line 45, in <module>\n",
      "    from tensorflow.python.training.saver import BaseSaverBuilder\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\python\\training\\saver.py\", line 50, in <module>\n",
      "    from tensorflow.python.training import py_checkpoint_reader\n",
      "  File \"C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\python\\training\\py_checkpoint_reader.py\", line 19, in <module>\n",
      "    from tensorflow.python.util._pywrap_checkpoint_reader import CheckpointReader\n"
     ]
    },
    {
     "ename": "AttributeError",
     "evalue": "_ARRAY_API not found",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mAttributeError\u001b[0m                            Traceback (most recent call last)",
      "\u001b[1;31mAttributeError\u001b[0m: _ARRAY_API not found"
     ]
    },
    {
     "ename": "SystemError",
     "evalue": "initialization of _pywrap_checkpoint_reader raised unreported exception",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mSystemError\u001b[0m                               Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[2], line 2\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[38;5;66;03m# TensorFlow and tf.keras\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mtf\u001b[39;00m\n\u001b[0;32m      3\u001b[0m \u001b[38;5;66;03m# 深度学习高级API\u001b[39;00m\n\u001b[0;32m      4\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m keras\n",
      "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\__init__.py:47\u001b[0m\n\u001b[0;32m     44\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m tf2 \u001b[38;5;28;01mas\u001b[39;00m _tf2\n\u001b[0;32m     45\u001b[0m _tf2\u001b[38;5;241m.\u001b[39menable()\n\u001b[1;32m---> 47\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_api\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mv2\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m __internal__\n\u001b[0;32m     48\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_api\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mv2\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m __operators__\n\u001b[0;32m     49\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_api\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mv2\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m audio\n",
      "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\_api\\v2\\__internal__\\__init__.py:11\u001b[0m\n\u001b[0;32m      9\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_api\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mv2\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m__internal__\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m decorator\n\u001b[0;32m     10\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_api\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mv2\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m__internal__\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m dispatch\n\u001b[1;32m---> 11\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_api\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mv2\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m__internal__\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m distribute\n\u001b[0;32m     12\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_api\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mv2\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m__internal__\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m eager_context\n\u001b[0;32m     13\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_api\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mv2\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m__internal__\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m feature_column\n",
      "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\_api\\v2\\__internal__\\distribute\\__init__.py:8\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[38;5;124;03m\"\"\"Public API for tf._api.v2.__internal__.distribute namespace\u001b[39;00m\n\u001b[0;32m      4\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m      6\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01msys\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01m_sys\u001b[39;00m\n\u001b[1;32m----> 8\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_api\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mv2\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m__internal__\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m combinations\n\u001b[0;32m      9\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_api\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mv2\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m__internal__\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m interim\n\u001b[0;32m     10\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_api\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mv2\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m__internal__\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m multi_process_runner\n",
      "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\_api\\v2\\__internal__\\distribute\\combinations\\__init__.py:8\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[38;5;124;03m\"\"\"Public API for tf._api.v2.__internal__.distribute.combinations namespace\u001b[39;00m\n\u001b[0;32m      4\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m      6\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01msys\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01m_sys\u001b[39;00m\n\u001b[1;32m----> 8\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcombinations\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m env \u001b[38;5;66;03m# line: 456\u001b[39;00m\n\u001b[0;32m      9\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcombinations\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m generate \u001b[38;5;66;03m# line: 365\u001b[39;00m\n\u001b[0;32m     10\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcombinations\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m in_main_process \u001b[38;5;66;03m# line: 418\u001b[39;00m\n",
      "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\python\\distribute\\combinations.py:33\u001b[0m\n\u001b[0;32m     29\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01msix\u001b[39;00m\n\u001b[0;32m     32\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mclient\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m session\n\u001b[1;32m---> 33\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m collective_all_reduce_strategy\n\u001b[0;32m     34\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m distribute_lib\n\u001b[0;32m     35\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m multi_process_runner\n",
      "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\python\\distribute\\collective_all_reduce_strategy.py:25\u001b[0m\n\u001b[0;32m     23\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mprotobuf\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m tensorflow_server_pb2\n\u001b[0;32m     24\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m collective_util\n\u001b[1;32m---> 25\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m cross_device_ops \u001b[38;5;28;01mas\u001b[39;00m cross_device_ops_lib\n\u001b[0;32m     26\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m cross_device_utils\n\u001b[0;32m     27\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m device_util\n",
      "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\python\\distribute\\cross_device_ops.py:28\u001b[0m\n\u001b[0;32m     26\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mclient\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m device_lib\n\u001b[0;32m     27\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m collective_util\n\u001b[1;32m---> 28\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m cross_device_utils\n\u001b[0;32m     29\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m device_util\n\u001b[0;32m     30\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m distribute_utils\n",
      "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\python\\distribute\\cross_device_utils.py:22\u001b[0m\n\u001b[0;32m     19\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtyping\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m Callable, List, Optional, Union\n\u001b[0;32m     21\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m collective_util\n\u001b[1;32m---> 22\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m values \u001b[38;5;28;01mas\u001b[39;00m value_lib\n\u001b[0;32m     23\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01meager\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m backprop_util\n\u001b[0;32m     24\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01meager\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m context\n",
      "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\python\\distribute\\values.py:23\u001b[0m\n\u001b[0;32m     21\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mprotobuf\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m struct_pb2\n\u001b[0;32m     22\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m device_util\n\u001b[1;32m---> 23\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m distribute_lib\n\u001b[0;32m     24\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m packed_distributed_variable \u001b[38;5;28;01mas\u001b[39;00m packed\n\u001b[0;32m     25\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m reduce_util\n",
      "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\python\\distribute\\distribute_lib.py:205\u001b[0m\n\u001b[0;32m    203\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mautograph\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m ag_ctx \u001b[38;5;28;01mas\u001b[39;00m autograph_ctx\n\u001b[0;32m    204\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mautograph\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mimpl\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m api \u001b[38;5;28;01mas\u001b[39;00m autograph\n\u001b[1;32m--> 205\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdata\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mops\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m dataset_ops\n\u001b[0;32m    206\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m collective_util\n\u001b[0;32m    207\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdistribute\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m device_util\n",
      "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\python\\data\\ops\\dataset_ops.py:34\u001b[0m\n\u001b[0;32m     32\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdata\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mops\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m dataset_autograph\n\u001b[0;32m     33\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdata\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mops\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m debug_mode\n\u001b[1;32m---> 34\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdata\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mops\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m iterator_ops\n\u001b[0;32m     35\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdata\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mops\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m options \u001b[38;5;28;01mas\u001b[39;00m options_lib\n\u001b[0;32m     36\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdata\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mops\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m structured_function\n",
      "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\python\\data\\ops\\iterator_ops.py:45\u001b[0m\n\u001b[0;32m     43\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01msaved_model\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m nested_structure_coder\n\u001b[0;32m     44\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtrackable\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m base \u001b[38;5;28;01mas\u001b[39;00m trackable\n\u001b[1;32m---> 45\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtraining\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01msaver\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m BaseSaverBuilder\n\u001b[0;32m     46\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mutil\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m deprecation\n\u001b[0;32m     47\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mutil\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcompat\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m collections_abc\n",
      "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\python\\training\\saver.py:50\u001b[0m\n\u001b[0;32m     48\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01msaved_model\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpywrap_saved_model\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m metrics\n\u001b[0;32m     49\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtrackable\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m base \u001b[38;5;28;01mas\u001b[39;00m trackable\n\u001b[1;32m---> 50\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtraining\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m py_checkpoint_reader\n\u001b[0;32m     51\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtraining\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m training_util\n\u001b[0;32m     52\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtraining\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01msaving\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m saveable_object\n",
      "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\tensorflow\\python\\training\\py_checkpoint_reader.py:19\u001b[0m\n\u001b[0;32m     17\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mframework\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m errors_impl\n\u001b[0;32m     18\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mutil\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m compat\n\u001b[1;32m---> 19\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mutil\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_pywrap_checkpoint_reader\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m CheckpointReader\n\u001b[0;32m     20\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtensorflow\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mutil\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtf_export\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m tf_export\n\u001b[0;32m     23\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21merror_translator\u001b[39m(e):\n",
      "\u001b[1;31mSystemError\u001b[0m: initialization of _pywrap_checkpoint_reader raised unreported exception"
     ]
    }
   ],
   "source": [
    "# TensorFlow and tf.keras\n",
    "import tensorflow as tf\n",
    "# 深度学习高级API\n",
    "from tensorflow import keras\n",
    "\n",
    "# 数学运算（矩阵计算）\n",
    "import numpy as np\n",
    "# 类似matlab的绘图工具\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "print(tf.__version__)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "yR0EdgrLCaWR"
   },
   "source": [
    "## 导入并加载 Fashion MNIST 数据集"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "DLdCchMdCaWQ"
   },
   "source": [
    "[Fashion MNIST](https://github.com/zalandoresearch/fashion-mnist) 数据集包含 10 个类别的 70000 个灰度图像。一般使用 60000 个图像来训练网络，使用 10000 个图像来评估网络学习对图像分类的准确率。这些图像以低分辨率（28x28 像素）展示了单件衣物，如下所示：\n",
    "\n",
    "<table>\n",
    "  <tr><td>     <img alt=\"Fashion MNIST sprite\" src=\"https://tensorflow.google.cn/images/fashion-mnist-sprite.png\" class=\"\"> </td></tr>\n",
    "</table>\n",
    "\n",
    "Fashion MNIST 与经典 [MNIST](http://yann.lecun.com/exdb/mnist/) 数据集类似，MNIST 数据集包含手写数字（0、1、2 等）的图像，常被用作计算机视觉机器学习程序的“Hello, World”。MNIST网站上列举了不同分类器和神经网络算法的分类效果，也十分值得学习。\n",
    "<table>\n",
    "  <tr><td>     <img alt=\"MNIST sprite\" src=\"https://note.youdao.com/yws/api/personal/file/WEB6e018826f54f8b7ef1f447758fd799eb?method=download&shareKey=75e16dc3d176380cea4a726f3e2b5b29\" class=\"\"> </td></tr>\n",
    "</table>\n",
    "\n",
    "Fashion MNIST 比常规 MNIST 更具挑战性，因为其图像更具有多样化。这两个数据集都相对较小，其格式相同，都用于验证某个算法是否按预期工作。对于代码的测试和调试，它们都是很好的起点。\n",
    "\n",
    "我们可以直接从 Tensorflow 访问 Fashion MNIST。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "7MqDQO0KCaWS"
   },
   "outputs": [],
   "source": [
    "fashion_mnist = keras.datasets.fashion_mnist\n",
    "\n",
    "# 返回两个值\n",
    "(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "t9FDsUlxCaWW"
   },
   "source": [
    "加载数据集会返回四个 NumPy 数组：\n",
    "\n",
    "- `train_images` 和 `train_labels` 数组是*训练集*，即模型用于学习的数据。\n",
    "- `test_images` 和 `test_labels` 数组是*测试集*，会被用来对模型进行测试。\n",
    "\n",
    "每一个图像都是 28x28 的 NumPy 数组，value 介于 0 到 255 之间。*标签*是整数数组，介于 0 到 9 之间。这些标签与服装*类别*一一对应：\n",
    "\n",
    "|标签<div style=\"width:50px\">|类别<div style=\"width:100px\">|\n",
    "|:-------:|:-------|\n",
    "|0|T恤|\n",
    "|1|裤子|\n",
    "|2|卫衣|\n",
    "|3|连衣裙|\n",
    "|4|外套|\n",
    "|5|凉鞋|\n",
    "|6|衬衫|\n",
    "|7|运动鞋|\n",
    "|8|包|\n",
    "|9|短靴|\n",
    "\n",
    "每个图像都应该被映射到一个标签。由于数据集不包括*类别*，先存储到数组中，稍后绘制图像时将会使用："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "id": "IjnLH5S2CaWx"
   },
   "outputs": [],
   "source": [
    "class_names = ['T-shirt', 'Pants', 'Pullover', 'Dress', 'Coat',\n",
    "               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Brm0b_KACaWX"
   },
   "source": [
    "## 浏览数据\n",
    "\n",
    "在训练模型之前，我们先浏览一下数据集的格式。以下代码显示训练集的数据格式为一个三维数组，共有 60000 个图像，每个图像由 28 x 28 的像素表示："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "id": "zW5k_xz1CaWX"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000, 28, 28)"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_images.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "cIAcvQqMCaWf"
   },
   "source": [
    "同样，训练集中有 60000 个标签："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "id": "TRFYHB2mCaWb"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "60000"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(train_labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "YSlYxFuRCaWk"
   },
   "source": [
    "每个标签都是一个 0 到 9 之间的整数："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "XKnCTHz4CaWg"
   },
   "outputs": [],
   "source": [
    "train_labels"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "TMPI88iZpO2T"
   },
   "source": [
    "测试集中有 10000 个图像。同样，每个图像都由 28x28 个像素表示："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "2KFnYlcwCaWl"
   },
   "outputs": [],
   "source": [
    "test_images.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "rd0A0Iu0CaWq"
   },
   "source": [
    "测试集包含 10000 个图像标签："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "id": "iJmPr5-ACaWn"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10000"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(test_labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ES6uQoLKCaWr"
   },
   "source": [
    "## 预处理数据\n",
    "\n",
    "在训练网络之前，必须对数据进行预处理，也就是归一化，消除不同量纲的变量对于参数学习的影响。通过pyplot检查训练集中的第一个图像，会看到像素值处于 0 到 255 之间："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "id": "m4VEw8Ud9Quh"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画布\n",
    "plt.figure()\n",
    "# 渲染\n",
    "plt.imshow(train_images[0])\n",
    "# 展示色条\n",
    "plt.colorbar()\n",
    "# 展示网格\n",
    "plt.grid(False)\n",
    "# 显示\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Wz7l27Lz9S1P"
   },
   "source": [
    "归一化公式：(x-min)/(max-min)，因此将这些值除以 255，以便缩小至 0 到 1 之间，注意：*训练集*和*测试集*均需要进行预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "id": "bW5WzIPlCaWv"
   },
   "outputs": [],
   "source": [
    "train_images = train_images / 255.0\n",
    "\n",
    "test_images = test_images / 255.0"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Ee638AlnCaWz"
   },
   "source": [
    "为了验证数据的格式是否正确，让我们看一看*训练集*中的前 25 个图像，并在每个图像下方显示类别名称。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "id": "oZTImqg_CaW1"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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/OO66aabBrtjx45Ru/nz51d9ziKGJ7KRI0dG+/79738Hmx8mX3311ajd+++vXMrnW9/6VrCffvrpqB1P7DNnzgz2dtttF7W7/vrrg80Tt59oeds/ELU27xOfb7U/gN/85jej7Q8+WLkkHv/IAXGfXXnllRU/F4i9AIMGDQq29yLwgy4/6Pg/cO6///5gv/HGG8E+8sgjo3bHHHNMsBv60NeaSX2v55+PltLC22+/HexZs2YFe+rUqVE7nj95buV+AOLxy+No4MCBUbtaHFNt824QQgghhHDooUcIIYQQhUAPPUIIIYQoBIrpEc2Kz97acsstg71s2bJg9+jRI2rHGj1nW3FMgm/HMT3t27eP2vH7OL6nFjItagEONP3yl78c7eM+fPPNN6N9HGfA15yzf/zxOc7Lx3IxHDjMMQoA8JWvfCXYHG9wxhlnRO3OO++8YPt4g5YKumwo1QZl//jHPw728uXLo31du3YNts/e4jHI/eyDWvnaf/vb3w727rvvHrXj4Ff+XB9vxzFCnE3E8WJAHHj9gx/8INpXxIW058yZE+yFCxdG+3r16hVs7j8/f3If8Vzosy856YTjfXzQdlMF+68J8vQIIYQQohDooUcIIYQQhUDylmhWOF0SiOvlcFq6l8F4e/PNNw92quggSyDe3c3vGzduXLAlb5U49dRTg+0lEU5l9bIVyywsEfnSAixrcgmCAw88MGq3ySabBPutt94K9kYbbRS1y5Om7r333qjdiBEjgv34449H+1qDpMWk0rLnzp0bbC4L4WVjljf89+djduvWreJ7gFhmuu2224LN0hQQy1jcr5988knu57LNkhgATJs2LfcYLMfwPi/TtCVYZmKZCojLEXTv3j3YN998c9Ru+PDhwT7ssMOCfdBBB0Xttt9++4qf5UuBcNmCWiliKE+PEEIIIQqBHnqEEEIIUQgkb4lmhaUMIJagUllBnAnE7movW/Ex2F3vXfIsb3n5pqhcd911weZqvD67hq9/KmuI+8av3cProrHb28ua3G8pmYK311tvvWB36hQvv8MS2R133BHt4wq/rYHUUh4PPfRQsLmP+LoD8bVKrWnH47RLly7RPpao77777mD76rwsX7Ps4e8hXteJJTw/1vmeeuSRR6J9++23X+77WjN8PVjCBOLry0vwALGsyVLl7Nmzo3a8diFn8y1atChqx9Iw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\n",
      "text/plain": [
       "<Figure size 720x720 with 25 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10,10))\n",
    "for i in range(25):\n",
    "    plt.subplot(5,5,i+1)\n",
    "    plt.xticks([])\n",
    "    plt.yticks([])\n",
    "    plt.grid(False)\n",
    "    plt.imshow(train_images[i], cmap=plt.cm.binary)\n",
    "    plt.xlabel(class_names[train_labels[i]])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "59veuiEZCaW4"
   },
   "source": [
    "## 构建模型\n",
    "\n",
    "构建神经网络需要先配置模型的层，然后再编译模型。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Gxg1XGm0eOBy"
   },
   "source": [
    "### 设置层\n",
    "\n",
    "神经网络的基本组成部分是*层*。层会从向其馈送的数据中提取表示形式。希望这些表示形式有助于解决手头上的问题。\n",
    "\n",
    "大多数深度学习都包括将简单的层链接在一起。大多数层（如 `tf.keras.layers.Dense`）都具有在训练期间才会学习的参数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "9ODch-OFCaW4"
   },
   "outputs": [],
   "source": [
    "model = keras.Sequential([\n",
    "    keras.layers.Flatten(input_shape=(28, 28)),\n",
    "    keras.layers.Dense(128, activation='relu'),\n",
    "    keras.layers.Dense(10)\n",
    "])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "gut8A_7rCaW6"
   },
   "source": [
    "该网络的第一层 `tf.keras.layers.Flatten` 将图像格式从二维数组（28 x 28 像素）转换成一维数组（28 x 28 = 784 像素）。将该层视为图像中未堆叠的像素行并将其排列起来。该层没有要学习的参数，它只会重新格式化数据。\n",
    "\n",
    "展平像素后，网络会包括两个 `tf.keras.layers.Dense` 层的序列。它们是密集连接或全连接神经层。第一个 `Dense` 层有 128 个节点（或神经元）。第二个（也是最后一个）层会返回一个长度为 10 的 logits 数组。每个节点都包含一个得分，用来表示当前图像属于 10 个类中的哪一类。\n",
    "\n",
    "### 编译模型\n",
    "\n",
    "在准备对模型进行训练之前，还需要再对其进行一些设置。以下内容是在模型的*编译*步骤中添加的：\n",
    "\n",
    "- *损失函数* - 用于测量模型在训练期间的准确率。您会希望最小化此函数，以便将模型“引导”到正确的方向上。\n",
    "- *优化器* - 决定模型如何根据其看到的数据和自身的损失函数进行更新。\n",
    "- *指标* - 用于监控训练和测试步骤。以下示例使用了*准确率*，即被正确分类的图像的比率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Lhan11blCaW7"
   },
   "outputs": [],
   "source": [
    "model.compile(optimizer='adam',\n",
    "              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n",
    "              metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "qKF6uW-BCaW-"
   },
   "source": [
    "## 训练模型\n",
    "\n",
    "训练神经网络模型需要执行以下步骤：\n",
    "\n",
    "1. 将训练数据馈送给模型。在本例中，训练数据位于 `train_images` 和 `train_labels` 数组中。\n",
    "2. 模型学习将图像和标签关联起来。\n",
    "3. 要求模型对测试集（在本例中为 `test_images` 数组）进行预测。\n",
    "4. 验证预测是否与 `test_labels` 数组中的标签相匹配。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Z4P4zIV7E28Z"
   },
   "source": [
    "### 向模型馈送数据\n",
    "\n",
    "要开始训练，请调用 `model.fit` 方法，这样命名是因为该方法会将模型与训练数据进行“拟合”："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "xvwvpA64CaW_"
   },
   "outputs": [],
   "source": [
    "model.fit(train_images, train_labels, epochs=10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "W3ZVOhugCaXA"
   },
   "source": [
    "在模型训练期间，会显示损失和准确率指标。此模型在训练数据上的准确率达到了 0.91（或 91%）左右。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "wCpr6DGyE28h"
   },
   "source": [
    "### 评估准确率\n",
    "\n",
    "接下来，比较模型在测试数据集上的表现："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "VflXLEeECaXC"
   },
   "outputs": [],
   "source": [
    "test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)\n",
    "\n",
    "print('\\nTest accuracy:', test_acc)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "yWfgsmVXCaXG"
   },
   "source": [
    "结果表明，模型在测试数据集上的准确率略低于训练数据集。训练准确率和测试准确率之间的差距代表*过拟合*。过拟合是指机器学习模型在新的、以前未曾见过的输入上的表现不如在训练数据上的表现。过拟合的模型会“记住”训练数据集中的噪声和细节，从而对模型在新数据上的表现产生负面影响。有关更多信息，请参阅以下内容：\n",
    "\n",
    "- [演示过拟合](https://tensorflow.google.cn/tutorials/keras/overfit_and_underfit#demonstrate_overfitting)\n",
    "- [避免过拟合的策略](https://tensorflow.google.cn/tutorials/keras/overfit_and_underfit#strategies_to_prevent_overfitting)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "v-PyD1SYE28q"
   },
   "source": [
    "### 进行预测\n",
    "\n",
    "在模型经过训练后，您可以使用它对一些图像进行预测。模型具有线性输出，即 [logits](https://developers.google.com/machine-learning/glossary#logits)。您可以附加一个 softmax 层，将 logits 转换成更容易理解的概率。 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "DnfNA0CrQLSD"
   },
   "outputs": [],
   "source": [
    "probability_model = tf.keras.Sequential([model, \n",
    "                                         tf.keras.layers.Softmax()])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Gl91RPhdCaXI"
   },
   "outputs": [],
   "source": [
    "predictions = probability_model.predict(test_images)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "x9Kk1voUCaXJ"
   },
   "source": [
    "在上例中，模型预测了测试集中每个图像的标签。我们来看看第一个预测结果："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "3DmJEUinCaXK"
   },
   "outputs": [],
   "source": [
    "predictions[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "-hw1hgeSCaXN"
   },
   "source": [
    "预测结果是一个包含 10 个数字的数组。它们代表模型对 10 种不同服装中每种服装的“置信度”。您可以看到哪个标签的置信度值最大："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "qsqenuPnCaXO"
   },
   "outputs": [],
   "source": [
    "np.argmax(predictions[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "E51yS7iCCaXO"
   },
   "source": [
    "因此，该模型非常确信这个图像是短靴，或 `class_names[9]`。通过检查测试标签发现这个分类是正确的："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Sd7Pgsu6CaXP"
   },
   "outputs": [],
   "source": [
    "test_labels[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ygh2yYC972ne"
   },
   "source": [
    "您可以将其绘制成图表，看看模型对于全部 10 个类的预测。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "DvYmmrpIy6Y1"
   },
   "outputs": [],
   "source": [
    "def plot_image(i, predictions_array, true_label, img):\n",
    "  predictions_array, true_label, img = predictions_array, true_label[i], img[i]\n",
    "  plt.grid(False)\n",
    "  plt.xticks([])\n",
    "  plt.yticks([])\n",
    "\n",
    "  plt.imshow(img, cmap=plt.cm.binary)\n",
    "\n",
    "  predicted_label = np.argmax(predictions_array)\n",
    "  if predicted_label == true_label:\n",
    "    color = 'blue'\n",
    "  else:\n",
    "    color = 'red'\n",
    "\n",
    "  plt.xlabel(\"{} {:2.0f}% ({})\".format(class_names[predicted_label],\n",
    "                                100*np.max(predictions_array),\n",
    "                                class_names[true_label]),\n",
    "                                color=color)\n",
    "\n",
    "def plot_value_array(i, predictions_array, true_label):\n",
    "  predictions_array, true_label = predictions_array, true_label[i]\n",
    "  plt.grid(False)\n",
    "  plt.xticks(range(10))\n",
    "  plt.yticks([])\n",
    "  thisplot = plt.bar(range(10), predictions_array, color=\"#777777\")\n",
    "  plt.ylim([0, 1])\n",
    "  predicted_label = np.argmax(predictions_array)\n",
    "\n",
    "  thisplot[predicted_label].set_color('red')\n",
    "  thisplot[true_label].set_color('blue')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Zh9yABaME29S"
   },
   "source": [
    "### 验证预测结果\n",
    "\n",
    "在模型经过训练后，您可以使用它对一些图像进行预测。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "d4Ov9OFDMmOD"
   },
   "source": [
    "我们来看看第 0 个图像、预测结果和预测数组。正确的预测标签为蓝色，错误的预测标签为红色。数字表示预测标签的百分比（总计为 100）。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "HV5jw-5HwSmO"
   },
   "outputs": [],
   "source": [
    "i = 0\n",
    "plt.figure(figsize=(6,3))\n",
    "plt.subplot(1,2,1)\n",
    "plot_image(i, predictions[i], test_labels, test_images)\n",
    "plt.subplot(1,2,2)\n",
    "plot_value_array(i, predictions[i],  test_labels)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Ko-uzOufSCSe"
   },
   "outputs": [],
   "source": [
    "i = 12\n",
    "plt.figure(figsize=(6,3))\n",
    "plt.subplot(1,2,1)\n",
    "plot_image(i, predictions[i], test_labels, test_images)\n",
    "plt.subplot(1,2,2)\n",
    "plot_value_array(i, predictions[i],  test_labels)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "kgdvGD52CaXR"
   },
   "source": [
    "让我们用模型的预测绘制几张图像。请注意，即使置信度很高，模型也可能出错。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "hQlnbqaw2Qu_"
   },
   "outputs": [],
   "source": [
    "# Plot the first X test images, their predicted labels, and the true labels.\n",
    "# Color correct predictions in blue and incorrect predictions in red.\n",
    "num_rows = 5\n",
    "num_cols = 3\n",
    "num_images = num_rows*num_cols\n",
    "plt.figure(figsize=(2*2*num_cols, 2*num_rows))\n",
    "for i in range(num_images):\n",
    "  plt.subplot(num_rows, 2*num_cols, 2*i+1)\n",
    "  plot_image(i, predictions[i], test_labels, test_images)\n",
    "  plt.subplot(num_rows, 2*num_cols, 2*i+2)\n",
    "  plot_value_array(i, predictions[i], test_labels)\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "R32zteKHCaXT"
   },
   "source": [
    "## 使用训练好的模型\n",
    "\n",
    "最后，使用训练好的模型对单个图像进行预测。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "yRJ7JU7JCaXT"
   },
   "outputs": [],
   "source": [
    "# Grab an image from the test dataset.\n",
    "img = test_images[1]\n",
    "\n",
    "print(img.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "vz3bVp21CaXV"
   },
   "source": [
    "`tf.keras` 模型经过了优化，可同时对一个*批*或一组样本进行预测。因此，即便您只使用一个图像，您也需要将其添加到列表中："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "lDFh5yF_CaXW"
   },
   "outputs": [],
   "source": [
    "# Add the image to a batch where it's the only member.\n",
    "img = (np.expand_dims(img,0))\n",
    "\n",
    "print(img.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "EQ5wLTkcCaXY"
   },
   "source": [
    "现在预测这个图像的正确标签："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "o_rzNSdrCaXY"
   },
   "outputs": [],
   "source": [
    "predictions_single = probability_model.predict(img)\n",
    "\n",
    "print(predictions_single)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "6Ai-cpLjO-3A"
   },
   "outputs": [],
   "source": [
    "plot_value_array(1, predictions_single[0], test_labels)\n",
    "_ = plt.xticks(range(10), class_names, rotation=45)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "cU1Y2OAMCaXb"
   },
   "source": [
    "`keras.Model.predict` 会返回一组列表，每个列表对应一批数据中的每个图像。在批次中获取对我们（唯一）图像的预测："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "2tRmdq_8CaXb"
   },
   "outputs": [],
   "source": [
    "np.argmax(predictions_single[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "YFc2HbEVCaXd"
   },
   "source": [
    "该模型会按照预期预测标签。"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "无",
  "colab": {
   "collapsed_sections": [],
   "name": "classification.ipynb",
   "provenance": [],
   "toc_visible": true
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
